#pragma once

#include "Address.h"

namespace network {

    class Socket : public Address {

    public:

        /**
          * @brief  根据提供的套接字描述符地址创建Socket对象
          * @param  fd 一个套接字描述符
          * @param  address 地址对象 默认ip为127.0.0.1，端口8080
          */
        explicit Socket(int fd, Address address = Address("127.0.0.1", 8080)) : fd_(fd), Address(address) {}

        virtual ~Socket() = default;

        /**
          * @brief  创建一个默认的Socket对象
          * @retval Socket对象
          */
        static Socket createSocket();

        /**
          * @brief  设置socket是否为非阻塞模式
          * @param  on 是否非阻塞 默认为非阻塞
          */
        void setNonBlock(bool on = true) const;

        /**
          * @brief  获取该套接字描述符
          * @retval 套接字描述符
          */
        int getFd() const { return fd_; }

        /**
          * @brief  断开关闭套接字描述符
          * @note   请勿对一个Socket对象重复执行关闭操作
          */
        void closeFd() const;

    protected:

        // 套接字描述符
        int fd_;

    };

}